{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "nbsphinx": "hidden"
   },
   "outputs": [],
   "source": [
    "# This is a hidden cell which will be executed but will not show up in Sphinx docs.\n",
    "# To hide a cell, in Jupyter go to Menu->View->Cell Toolbar->Edit Metadata\n",
    "# and enter in {\"nbsphinx\": \"hidden\"}\n",
    "\n",
    "# Set figure size and font size\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['figure.figsize'] = [10, 6]\n",
    "plt.rcParams['font.size'] = 12\n",
    "\n",
    "from phidl import set_quickplot_options\n",
    "# set_quickplot_options(show_ports=True, show_subports=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Routing\n",
    "\n",
    "Often when creating a design, you need to connect geometries together with wires or waveguides.  To help with that, PHIDL has the `phidl.routing` (`pr`) module, which can flexibly and quickly create routes between ports."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Simple quadrilateral routes\n",
    "\n",
    "In general, a route is a polygon used to connect two ports. Simple routes are easy to create using `pr.route_quad()`. This function returns a quadrilateral route that directly connects two ports,  as shown in this example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from phidl import Device, quickplot as qp\n",
    "import phidl.geometry as pg\n",
    "import phidl.routing as pr\n",
    "\n",
    "# Use pg.compass() to make 2 boxes with North/South/East/West ports\n",
    "D = Device()\n",
    "c1 = D << pg.compass()\n",
    "c2 = D << pg.compass().move([10,5]).rotate(15)\n",
    "\n",
    "# Connect the East port of one box to the West port of the other\n",
    "R = pr.route_quad(c1.ports['E'], c2.ports['W'],\n",
    "                  width1 = None, width2 = None,  # width = None means use Port width\n",
    "                  layer = 2)\n",
    "qp([R,D])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Automatic manhattan routing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In many cases, we need to draw wires or waveguides between two objects, and we'd prefer not to have to hand-calculate all the points.  In these instances, we can use the automatic routing functions `pr.route_smooth()` and `pr.route_sharp()`. \n",
    "\n",
    "These functions allow you to route along a `Path`, and come with built-in options that let you control the shape of the path and how to extrude it. If you don't need detailed control over the path your route takes, you can let these functions create an automatic manhattan route by leaving the default `path_type='manhattan'`. Just make sure the ports you're to routing between face parallel or orthogonal directions. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from phidl import Device, quickplot as qp\n",
    "import phidl.geometry as pg\n",
    "import phidl.routing as pr\n",
    "\n",
    "# Use pg.compass() to make 4 boxes with North/South/East/West ports\n",
    "D = Device()\n",
    "smooth1 = D << pg.compass([4,15])\n",
    "smooth2 = D << pg.compass([15,4]).move([35,35])\n",
    "sharp1 = D << pg.compass([4,15]).movex(50)\n",
    "sharp2 = D << pg.compass([15,4]).move([35,35]).movex(50)\n",
    "\n",
    "# Connect the South port of one box to the West port of the other\n",
    "R1 = pr.route_smooth(smooth1.ports['S'], smooth2.ports['W'], radius=8, layer = 2)\n",
    "R2 = pr.route_sharp(  sharp1.ports['S'],  sharp2.ports['W'], layer = 2)\n",
    "\n",
    "qp([D, R1, R2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Customized widths / cross-sections\n",
    "\n",
    "By default, route functions such as `route_sharp()` and `route_smooth()` will connect one port to another with polygonal paths that are as wide as the ports are.  However, you can override this by setting the `width` parameter in the same way as `extrude()`:\n",
    "\n",
    "- If set to a single number (e.g. `width=1.7`): makes a fixed-width extrusion\n",
    "- If set to a 2-element array (e.g. `width=[1.8,2.5]`): makes an extrusion whose width varies linearly from `width[0]` to `width[1]`\n",
    "- If set to a CrossSection: uses the CrossSection parameters for extrusion"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from phidl import CrossSection\n",
    "import phidl.routing as pr\n",
    "\n",
    "# Create input ports\n",
    "port1 = D.add_port(name='smooth1', midpoint=(40,  0), width=5, orientation=180)\n",
    "port2 = D.add_port(name='smooth2', midpoint=(0, -40), width=5, orientation=270)\n",
    "\n",
    "# (left) Setting width to a constant\n",
    "D1 = pr.route_smooth(port1, port2, width = 2, radius=10, layer = 0)\n",
    "\n",
    "# (middle) Setting width to a 2-element list to linearly vary the width\n",
    "D2 = pr.route_smooth(port1, port2, width = [7, 1.5], radius=10, layer = 1)\n",
    "\n",
    "# (right) Setting width to a CrossSection\n",
    "X = CrossSection()\n",
    "X.add(width=1, layer=4)\n",
    "X.add(width=2.5, offset =  3, layer = 5)\n",
    "X.add(width=2.5, offset = -3, layer = 5)\n",
    "D3 = pr.route_smooth(port1, port2, width = X, radius=10)\n",
    "\n",
    "qp([D1, D2.movex(50), D3.movex(100)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Details of operation\n",
    "\n",
    "The `route_smooth()` function works in three steps:\n",
    "\n",
    "1. It calculates a waypoint `Path` using a waypoint path function -- such as `pr.path_manhattan()` -- set by the `path_type`.\n",
    "2. It smooths out the waypoint `Path` using `pp.smooth()`.\n",
    "3. It extrudes the `Path` to create the route geometry.\n",
    "\n",
    "The `route_sharp()` function works similarly, but it omits step 2 to create sharp bends. The extra smoothing makes `route_smooth()` particularly useful for photonic / microwave waveguides, whereas `route_sharp()` is typically more useful for electrical wiring. \n",
    "\n",
    "To illustrate how these functions work, let's look at how you could manually implement a similar behaviour to `route_smooth(path_type='manhattan')`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from phidl import CrossSection\n",
    "import phidl.path as pp\n",
    "\n",
    "D = Device()\n",
    "port1 = D.add_port(name=1, midpoint=(40,0), width=5, orientation=180)\n",
    "port2 = D.add_port(name=2, midpoint=(0, -40), width=5, orientation=270)\n",
    "\n",
    "# Step 1: Calculate waypoint path\n",
    "route_path = pr.path_manhattan(port1, port2, radius=10)\n",
    "# Step 2: Smooth waypoint path\n",
    "smoothed_path = pp.smooth(route_path, radius=10, use_eff=True)\n",
    "# Step 3: Extrude path\n",
    "D.add_ref(smoothed_path.extrude(width=5, layer=0))\n",
    "\n",
    "qp([route_path,D])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can even customize the bends produced by `pr.route_smooth()` using the `smooth_options`, which are passed to `pp.smooth()`, such as controlling the corner-smoothing function or changing the number of points that will be rendered:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D = Device()\n",
    "port1 = D.add_port(name='smooth1', midpoint=(40,0), width=3, orientation=180)\n",
    "port2 = D.add_port(name='smooth2', midpoint=(0, -40), width=3, orientation=270)\n",
    "D.add_ref(pr.route_smooth(port1, port2, radius=10, smooth_options={'corner_fun': pp.arc, 'num_pts': 16}))\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Customizing route paths\n",
    "\n",
    "### Avoiding obstacles\n",
    "\n",
    "Sometimes, automatic routes will run into obstacles in your layout, like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import phidl.geometry as pg\n",
    "\n",
    "D = Device()\n",
    "Obstacle = D.add_ref(pg.rectangle(size=(30,15), layer=1)).move((10, -25))\n",
    "\n",
    "port1 = D.add_port(name=1, midpoint=(40,0), width=5, orientation=180)\n",
    "port2 = D.add_port(name=2, midpoint=(0, -40), width=5, orientation=270)\n",
    "\n",
    "D.add_ref(pr.route_smooth(port1, port2, radius=10, path_type='manhattan'))\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Example 1: Custom `J` paths.__ To avoid the other device, we need to customize the path our route takse. Luckily, PHIDL provides several waypoint path functions to help us do that quickly. Each of these waypoint path functions has a name of the form `pr.path_***` (e.g. `pr.path_L()`), and generates a particular path type with its own shape. All the available path types are described in detail below and in the __Geometry Reference__. In this case, we want to connect two orthogonal ports, but the ports are positioned such that we can't connect them with a single 90-degree turn. A `J`-shaped path with four line segments and three turns is perfect for this problem. We can tell `route_smooth` to use `pr.path_J()` as its waypoint path function via the argument `path_type='J'`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D = Device()\n",
    "Obstacle = D.add_ref(pg.rectangle(size=(30,15), layer=1))\n",
    "Obstacle.move((10, -25))\n",
    "port1 = D.add_port(name=1, midpoint=(40,0), width=5, orientation=180)\n",
    "port2 = D.add_port(name=2, midpoint=(0, -40), width=5, orientation=270)\n",
    "\n",
    "D.add_ref(pr.route_smooth(port1, port2, radius=10, path_type='J', length1=60, length2=20))\n",
    "qp(D)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For ease of use, the waypoint path functions are parameterized in terms of relative distances from ports. Above, we had to define the keyword arguments `length1` and `length2`, which are passed to `pr.route_J()` for the waypoint path calculation. These arguments `length1` and `length2` define the lengths of the line segments that exit `port1` and `port2` respectively (i.e. the first and last sements in the path). Once those first and last segments are set, `path_J()` completes the waypoint path with two more 90-degree turns. Note that just knowing `length1` and `length2`, along with the port positions and orientations, is enough to completely determine the waypoint path."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Example 2: Custom `C` paths.__ Now consider this routing problem:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D = Device()\n",
    "Obstacle = D.add_ref(pg.rectangle(size=(20,30),layer=1))\n",
    "Obstacle.move((10, -25))\n",
    "port1 = D.add_port(name=1, midpoint=(0,0), width=5, orientation=180)\n",
    "port2 = D.add_port(name=2, midpoint=(40, -5), width=5, orientation=0)\n",
    "\n",
    "D.add_ref(pr.route_sharp(port1, port2, path_type='manhattan'))\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this case, we want a `C` path. `C` paths have three parameters we need to define: \n",
    "+ `length1` and `length2`, which are the lengths of the segments that exit `port1` and `port2` (similar to the `J` path), as well as \n",
    "+ `left1`, which is the length of the segment that turns *left* from `port1`. \n",
    "\n",
    "In this case, we would actually prefer that the path turns *right* after it comes out of `port1`, so that our route avoids the other device. To make that happen, we can just set `left1<0`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D = Device()\n",
    "Obstacle = D.add_ref(pg.rectangle(size=(20,30),layer=1))\n",
    "Obstacle.move((10, -25))\n",
    "port1 = D.add_port(name=1, midpoint=(0,0), width=5, orientation=180)\n",
    "port2 = D.add_port(name=2, midpoint=(40, -5), width=5, orientation=0)\n",
    "\n",
    "D.add_ref(pr.route_sharp(port1, port2, path_type='C', length1=10, length2=10, left1=-10))\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Example 3: Custom `manual` paths.__ For even more complex route problems, we can use `path_type='manual'` to create a route along an arbitrary path. In the example below, we use a manual path to route our way out of a sticky situation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D = Device()\n",
    "Obstacle = D.add_ref(pg.rectangle(size=(30,15),layer=1)).move((0, -20))\n",
    "Obstacle2 = D.add_ref(pg.rectangle(size=(15,20), layer=1))\n",
    "Obstacle2.xmax,Obstacle2.ymin = Obstacle.xmax, Obstacle.ymax\n",
    "\n",
    "port1 = D.add_port(name=1, midpoint=(5,  0), width=5, orientation=0)\n",
    "port2 = D.add_port(name=2, midpoint=(50, 0), width=5, orientation=270)\n",
    "\n",
    "manual_path = [ port1.midpoint,\n",
    "                (Obstacle2.xmin-5, port1.y),\n",
    "                (Obstacle2.xmin-5, Obstacle2.ymax+5),\n",
    "                (Obstacle2.xmax+5, Obstacle2.ymax+5),\n",
    "                (Obstacle2.xmax+5, port2.y-5),\n",
    "                (port2.x, port2.y-5),\n",
    "                port2.midpoint ]\n",
    "\n",
    "D.add_ref(pr.route_sharp(port1, port2, path_type='manual', manual_path=manual_path))\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that to manually route between two ports, the first and last points in the `manual_path` should be the midpoints of the ports. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### List of routing path types"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "PHIDL provides the following waypoint path types for routing:\n",
    "\n",
    "| Path type   | Routing style| Segments   | Useful for ... | Parameters |\n",
    "| ----------- | ----------- | ----------- | ----------- | ----------- |\n",
    "| `manhattan` | Manhattan   | 1-5         | parallel or orthogonal ports.| `radius` |\n",
    "| `straight`  | Manhattan   | 1           | ports that point directly at each other.| -- |\n",
    "| `L`         | Manhattan   | 2           | orthogonal ports that can be connected with one turn.| -- |\n",
    "| `U`         | Manhattan   | 3           | parallel ports that face each other or same direction.| `length1` |\n",
    "| `J`         | Manhattan   | 4           | orthogonal ports that can't be connected with just one turn.| `length1`, `length2` |\n",
    "| `C`         | Manhattan   | 5           | parallel ports that face apart.| `length1`, `length2`, `left1` |\n",
    "| `V`         | Free        | 2           | ports at odd angles that face a common intersection point.| -- |\n",
    "| `Z`         | Free        | 3           | ports at odd angles.| `length1`, `length2` |\n",
    "| `manual`    | Free        | --          | fully custom paths. | `manual_path` |\n",
    "\n",
    "For more details on each path type, you can also look at the __API Documentation__ or the __Geometry Reference__.\n",
    "\n",
    "The path types can be classified by their routing style. Manhattan style routing uses only 90-degree turns, and thus requires that you route between ports that are orthogonal or parallel (note that the ports don't neccearrily have to point horizontally or vertically, though). For routing between ports at odd angles, you can use path types with a free routing style instead.\n",
    "\n",
    "Most path types are named after letters that they resemble to help you remember them. However, as you'll see in the examples below, some of the more complicated paths can take a variety of shapes. One good way to identify which manhattan-style route type you need is to count the number of line segments and consult the above table."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D = Device()\n",
    "\n",
    "#straight path\n",
    "port1 = D.add_port(name='S1', midpoint=(-50, 0), width=4, orientation=90)\n",
    "port2 = D.add_port(name='S2', midpoint=(-50, 50), width=4, orientation=270)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='straight'))\n",
    "#L path\n",
    "port1 = D.add_port(name='L1', midpoint=(30,0), width=4, orientation=180)\n",
    "port2 = D.add_port(name='L2', midpoint=(0, 50), width=4, orientation=270)\n",
    "D.add_ref(pr.route_smooth(port1, port2,  path_type='L'))\n",
    "#U path\n",
    "port1 = D.add_port(name='U1', midpoint=(50, 50), width=2, orientation=270)\n",
    "port2 = D.add_port(name='U2', midpoint=(80,50), width=4, orientation=270)\n",
    "D.add_ref(pr.route_smooth(port1, port2,  radius=10, path_type='U', length1=50))\n",
    "port1 = D.add_port(name='U3', midpoint=(50, 80), width=4, orientation=10)\n",
    "port2 = D.add_port(name='U4', midpoint=(80, 130), width=4, orientation=190)\n",
    "D.add_ref(pr.route_smooth(port1, port2,  path_type='U', length1=20))\n",
    "#J path\n",
    "port1 = D.add_port(name='J1', midpoint=(100, 25), width=4, orientation=270)\n",
    "port2 = D.add_port(name='J2', midpoint=(130, 50), width=4,  orientation=180)\n",
    "D.add_ref(pr.route_smooth(port1, port2,  path_type='J', length1=25, length2=10))\n",
    "port1 = D.add_port(name='J3', midpoint=(115, 105), width=5, orientation=270)\n",
    "port2 = D.add_port(name='J4', midpoint=(131, 130), width=5,  orientation=180)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='J', length1=25, length2=30))\n",
    "#C path\n",
    "port1 = D.add_port(name='C1', midpoint=(180, 35), width=4, orientation=90)\n",
    "port2 = D.add_port(name='C2', midpoint=(178, 15), width=4, orientation=270)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='C', length1=15, left1=30, length2=15))\n",
    "port1 = D.add_port(name='C3', midpoint=(150, 105), width=4, orientation=90)\n",
    "port2 = D.add_port(name='C4', midpoint=(180, 105), width=4, orientation=270)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='C', length1=25, left1=-15, length2=25))\n",
    "port1 = D.add_port(name='C5', midpoint=(150, 170), width=4, orientation=0)\n",
    "port2 = D.add_port(name='C6', midpoint=(175, 170), width=4, orientation=0)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='C', length1=10, left1=10, length2=10, radius=4))\n",
    "#V path\n",
    "port1 = D.add_port(name='V1', midpoint=(200,50), width=5, orientation=284)\n",
    "port2 = D.add_port(name='V2', midpoint=(230, 50), width=5, orientation=270-14)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='V'))\n",
    "#Z path\n",
    "port1 = D.add_port(name='Z1', midpoint=(280,0), width=4, orientation=190)\n",
    "port2 = D.add_port(name='Z2', midpoint=(250, 50), width=3, orientation=-10)\n",
    "D.add_ref(pr.route_smooth(port1, port2, path_type='Z', length1=30, length2=40))\n",
    "\n",
    "\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `manhattan` path type is bending-radius aware and can produce any route neccessary to connect two ports, as long as they are orthogonal or parallel. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "set_quickplot_options(show_ports=False, show_subports=False)\n",
    "\n",
    "D = Device() \n",
    "pitch = 40\n",
    "test_range=20\n",
    "x_centers = np.arange(5)*pitch\n",
    "y_centers = np.arange(3)*pitch\n",
    "xoffset = np.linspace(-1*test_range, test_range, 5)\n",
    "yoffset = np.linspace(-1*test_range, test_range, 3)\n",
    "for xidx, x0 in enumerate(x_centers):\n",
    "    for yidx, y0 in enumerate(y_centers):\n",
    "        name = '{}{}'.format(xidx, yidx)\n",
    "        port1 = D.add_port(name=name+'1', midpoint=(x0, y0), width=5, orientation=0)\n",
    "        port2 = D.add_port(name=name+'2', midpoint=(x0+xoffset[xidx], y0+yoffset[yidx]), \n",
    "                           width=5,  orientation=90)\n",
    "        D.add_ref(pr.route_smooth(port1, port2, route_type='manhattan'))\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Simple XY wiring\n",
    "\n",
    "Often one requires simple wiring between two existing objects with Ports.  For this purpose, you can use the `route_xy()` function. It allows a simple string to specify the path the wiring will take.  So the argument `directions = 'yxy'` means \"go 1 part in the Y direction, 1 part in the X direction, then 1 more part in the X direction\" with the understanding that 1 part X = (total X distance from port1 to port2)/(total number of 'x' in the directions)\n",
    "\n",
    "As an example, say we have two objects with multiple ports, and we want to route multiple wires between them without overlapping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from phidl import Device, quickplot as qp\n",
    "import phidl.routing as pr\n",
    "import phidl.geometry as pg\n",
    "\n",
    "# Create boxes with multiple North/South ports\n",
    "D = Device()\n",
    "c1 = D.add_ref( pg.compass_multi(ports={'N':3}) ) \n",
    "c2 = D.add_ref( pg.compass_multi(ports={'S':3}) ).move([6,6])\n",
    "\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can then `route_xy()` between them and use different `directions` arguments to prevent them from overlapping:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "D.add_ref( pr.route_xy(port1 = c1.ports['N1'], port2 = c2.ports['S1'],\n",
    "    directions = 'yyyxy', width = 0.1, layer = 2) )\n",
    "D.add_ref( pr.route_xy(port1 = c1.ports['N2'], port2 = c2.ports['S2'],\n",
    "    directions = 'yyxy',  width = 0.2, layer = 2) )\n",
    "D.add_ref( pr.route_xy(port1 = c1.ports['N3'], port2 = c2.ports['S3'],\n",
    "    directions = 'yxy',   width = 0.4, layer = 2) )\n",
    "\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- In the first case, when `directions = 'yyyxy'`: The route traveled up 3/4 of the total Y distance, then the full x distance, then the remaining 1/4 of the y distance (there are 4 `y` characters and only 1 `x` character)\n",
    "- In the second case, when `directions = 'yyxy'`: The route traveled up 2/3 of the total Y distance, then the full x distance, then the remaining 1/3 of the y distance\n",
    "- In the third case, when `directions = 'yxy'`: The route traveled up 1/2 of the total Y distance, then the full x distance, then the remaining 1/2 of the y distance"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Edit Metadata",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
